﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Management;
using System.Net.NetworkInformation;
using System.Reflection;
using System.Runtime.Serialization.Formatters.Binary;
using System.Windows.Controls;

namespace RiskMan.Config
{
    public class Cfg
    {
        public static String Start = "Старт";
        public static String Stop = "Стоп";

        public static readonly string ExecFile = "";

        public static TimeSpan UpdateStoptableInterval = TimeSpan.FromMilliseconds(500);

        public static string ZalogMoney = "Залоговые ден.средства";
        public static string KliringMoney = "Клиринговые ден.средства";
        public static string KliringZalogMoney = "Клиринговые залоговые ден.средства";

        public static String Unknown = "Не выбран";
        public static String StopLimit = "Стоп-лимит";
        public static string TakeProfit = "Тэйк-профит";
        public static string LinkedOrder = "Связанная заявка";
        public static string StopTakeOrder = "Тэйк-профит и стоп-лимит";
        public static string TakeProfitLimitOrder = "Тейк-профит(Лимит. заявка)";

        public static string Rub = "Рубли";
        public static string ValutPrice = "Валюта цены";
        public static string Persent = "Процентах";


        public static String MainfunctionRobot = "Робот";
        public static String MainLogRobot = "Лог робот";
        public static String MainLogSovetnik = "Лог советник";

        public static string Buy = "Купля";
        public static string Sell = "Продажа";

        public static string Active = "Активна";
        public static string Performed = "Исполнена";
        public static string PerformedStop = "Исполнена по стопу";
        public static string PerformedProfit = "Исполнена по профиту";
        public static string Cancel = "Снята";
        public static string AddToTs = "Выставлена заявка в ТС";
        public static string RemoveFormTs = "Отвергнута ТС";
        public static string OrderUnknown = "unknown";
        public static string BrokerCancel = "Отклонена брокером";

        public static string TypeGerchikRobot = "Робот";
        public static string TypeGerchikSovetnik = "Советник";

        public static string MainTableOrder = "Заявки";
        public static string MainTableDeal = "Сделки";
        public static string MainTableStopOrder = "Стоп-заявки";
        public static string MainTablePositionMMVB = "Позиции ММВБ";
        public static string MainTablePositionMoney = "Денежные средства ММВБ";
        public static string MainTableTtp = "Таблица текущих параметров";
        public static string MainTableHistory = "История";

        #region Параметры для транзака

        #region Статусты сессии на ММВБ и ФОРТС

        #region ММВБ
        /// <summary>
        /// Недоступно для торгов (ММВБ)
        /// </summary>
        public static string TransaqTradingStatusMMVBN = "N";
        /// <summary>
        /// Период открытия (ММВБ)
        /// </summary>
        public static string TransaqTradingStatusMMVBO = "O";
        /// <summary>
        /// Торги закрыты (ММВБ)
        /// </summary>
        public static string TransaqTradingStatusMMVBC = "C";
        /// <summary>
        /// Период закрытия (ММВБ)
        /// </summary>
        public static string TransaqTradingStatusMMVBF = "F";
        /// <summary>
        /// Перерыв (ММВБ)
        /// </summary>
        public static string TransaqTradingStatusMMVBB = "B";
        /// <summary>
        /// Торговая сессия (ММВБ)
        /// </summary>
        public static string TransaqTradingStatusMMVBT = "T";
        /// <summary>
        /// Период послеторгового аукциона (ММВБ)
        /// </summary>
        public static string TransaqTradingStatusMMVBL = "L";

        #endregion

        #region FORTS
        /// <summary>
        /// Сессия назначена. Нельзя ставить заявки, но можно удалять (FORTS)
        /// </summary>
        public static string TransaqTradingStatus0 = "0";
        /// <summary>
        /// Сессия идет. Можно ставить и удалять заявки (FORTS)
        /// </summary>
        public static string TransaqTradingStatus1 = "1";
        /// <summary>
        /// Приостановка торгов по всем инструментам. Нельзя ставить заявки, но можно удалять (FORTS)
        /// </summary>
        public static string TransaqTradingStatus2 = "2";
        /// <summary>
        /// Сессия принудительно завершена. Нельзя ставить и удалять заявки (FORTS)
        /// </summary>
        public static string TransaqTradingStatus3 = "3";
        /// <summary>
        /// Сессия завершена по времени. Нельзя ставить и удалять заявки (FORTS)
        /// </summary>
        public static string TransaqTradingStatus4 = "4";
        #endregion


        #endregion

        #region Статусы заявок

        public static string TransaqStatusOrderNone = "none";

        /// <summary>
        /// Активная
        /// </summary>
        public static string TransaqStatusOrderActive = "active";
        /// <summary>
        /// Снята трейдером (заявка уже попала на рынок и была отменена)
        /// </summary>
        public static string TransaqStatusOrderCancelled = "cancelled";
        /// <summary>
        /// Отклонена Брокером
        /// </summary>
        public static string TransaqStatusOrderDenied = "denied";
        /// <summary>
        /// Прекращена трейдером (условная заявка, которую сняли до наступления условия)
        /// </summary>
        public static string TransaqStatusOrderDisabled = "disabled";
        /// <summary>
        /// Время действия истекло
        /// </summary>
        public static string TransaqStatusOrderExpired = "expired";
        /// <summary>
        /// Не удалось выставить на биржу
        /// </summary>
        public static string TransaqStatusOrderFailed = "failed";
        /// <summary>
        /// Выставляется на биржу
        /// </summary>
        public static string TransaqStatusOrderForwarding = "forwarding";
        /// <summary>
        /// Статус не известен из-за проблем со связью с биржей
        /// </summary>
        public static string TransaqStatusOrderInactive = "inactive";
        /// <summary>
        /// Исполнена
        /// </summary>
        public static string TransaqStatusOrderMatched = "matched";
        /// <summary>
        /// Отклонена контрагентом
        /// </summary>
        public static string TransaqStatusOrderRefused = "refused";
        /// <summary>
        /// Отклонена биржей
        /// </summary>
        public static string TransaqStatusOrderRejected = "rejected";
        /// <summary>
        /// Аннулирована биржей
        /// </summary>
        public static string TransaqStatusOrderRemoved = "removed";
        /// <summary>
        /// Не наступило время активации
        /// </summary>
        public static string TransaqStatusOrderWait = "wait";
        /// <summary>
        /// Ожидает наступления условия
        /// </summary>
        public static string TransaqStatusOrderWatching = "watching";

        #endregion

        #region Статусы стоп-заявок

        /// <summary>
        /// Снята трейдером (заявка уже попала на рынок и была отменена)
        /// </summary>
        public static string TransaqStatusStopOrderCancelled = "cancelled";
        /// <summary>
        /// Отклонена Брокером
        /// </summary>
        public static string TransaqStatusStopOrderDenied = "denied";
        /// <summary>
        /// Прекращена трейдером (стоп-заявка, которую сняли до наступления условия)
        /// </summary>
        public static string TransaqStatusStopOrderDisabled = "disabled";
        /// <summary>
        /// Время действия истекло
        /// </summary>
        public static string TransaqStatusStopOrderExpried = "expired";
        /// <summary>
        /// Не удалось выставить на биржу
        /// </summary>
        public static string TransaqStatusStopOrderFailed = "failed";
        /// <summary>
        /// Ожидает исполнения связанной заявки
        /// </summary>
        public static string TransaqStatusStopOrderLinkwait = "linkwait";
        /// <summary>
        /// Отклонена биржей
        /// </summary>
        public static string TransaqStatusStopOrderRejected = "rejected";
        /// <summary>
        /// Выполнена (Stop Loss)
        /// </summary>
        public static string TransaqStatusStopOrderSlExecuted = "sl_executed";
        /// <summary>
        /// Стоп выставляется на биржу (Stop Loss)
        /// </summary>
        public static string TransaqStatusStopOrderSlForwarding = "sl_forwarding";
        /// <summary>
        /// Стоп ожидает исполнения в защитном периоде
        /// </summary>
        public static string TransaqStatusStopOrderslGuardtime = "sl_guarding";
        /// <summary>
        /// Ожидает исполнения в режиме коррекции (Take Profit)
        /// </summary>
        public static string TransaqStatusStopOrderTpCorrection = "tp_correction";
        /// <summary>
        /// Стоп ожидает исполнения в защитном режиме после коррекции (Take Profit)
        /// </summary>
        public static string TransaqStatusStopOrderTpCorrectionGuardtime = "tp_correction_guardtime";
        /// <summary>
        /// Выполнен (Take Profit)
        /// </summary>
        public static string TransaqStatusStopOrderTpExecuted = "tp_executed";
        /// <summary>
        /// Стоп выставляется на биржу (Take Profit)
        /// </summary>
        public static string TransaqStatusStopOrderTpForwarding = "tp_forwarding";
        /// <summary>
        /// Стоп ожидает исполнения в защитном периоде (Take Profit)
        /// </summary>
        public static string TransaqStatusStopOrderTpGuardtime = "tp_guardtime";
        /// <summary>
        /// Ожидает наступления условия
        /// </summary>
        public static string TransaqStatusStopOrderWatching = "watching";


        #endregion

        public static string limitedTransaq = "Limit";
        public static string MarketTransaq = "Market";



        #endregion

        #region Name Patterns

        public static string Pattern1Long = "Паттерн 1. Лонг";
        public static string Pattern1Short = "Паттерн 1. Шорт";
        public static string Pattern21Long = "Паттерн 2. Вариация 1. Лонг";
        public static string Pattern21Short = "Паттерн 2. Вариация 1. Шорт";
        public static string Pattern22Long = "Паттерн 2. Вариация 2. Лонг";
        public static string Pattern22Short = "Паттерн 2. Вариация 2. Шорт";
        public static string Pattern31Long = "Паттерн 3. Вариация 1. Лонг";
        public static string Pattern31Short = "Паттерн 3. Вариация 1. Шорт";
        public static string Pattern32Long = "Паттерн 3. Вариация 2. Лонг";
        public static string Pattern32Short = "Паттерн 3. Вариация 2. Шорт";

        #endregion


        public static void SetLog(string log)
        {
            try
            {
                String path = Environment.GetFolderPath(Environment.SpecialFolder.CommonDocuments) + "\\Robot\\";

                if (!Directory.Exists(path))
                {
                    System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(path);
                    dir.Create();
                }

                string name = "" + DateTime.Now.Year + DateTime.Now.Month + DateTime.Now.Day + ".txt";
                using (var file = new StreamWriter(path + name, true))
                    file.WriteLine(DateTime.Now + "   " + log);
            }
            catch (Exception)
            {

            }
        }
        public static void SetLog(string log, ListBox ListBox_Logs, Type type, MethodBase method)
        {
            try
            {
                String path = Environment.GetFolderPath(Environment.SpecialFolder.CommonDocuments) + "\\Robot\\";

                if (!Directory.Exists(path))
                {
                    System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(path);
                    dir.Create();
                }

                string name = "" + DateTime.Now.Year + DateTime.Now.Month + DateTime.Now.Day + ".txt";
                using (var file = new StreamWriter(path + name, true))
                    file.WriteLine(DateTime.Now + "   " + log);

                //ListBox_Logs.Items.Add(DateTime.Now + " " + log + " " + type.FullName + "." + method.Name);
                ListBox_Logs.Dispatcher.BeginInvoke(new Action(delegate()
                {
                    ListBox_Logs.Items.Add(DateTime.Now + " " + log);//+ " " + type.FullName + "." + method.Name);
                    /// что-нибудь делаем
                    ///                 
                    ListBox_Logs.InvalidateVisual();
                    ListBox_Logs.UpdateLayout();
                }));

            }
            catch (Exception)
            {

            }
        }
        public static void SetLog(string log, ListBox ListBox_Logs, Type type, MethodBase method, string tmp)
        {
            try
            {
                String path = Environment.GetFolderPath(Environment.SpecialFolder.CommonDocuments) + "\\Robot\\";

                if (!Directory.Exists(path))
                {
                    System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(path);
                    dir.Create();
                }

                string name = "" + DateTime.Now.Year + DateTime.Now.Month + DateTime.Now.Day + ".txt";
                using (var file = new StreamWriter(path + name, true))
                    file.WriteLine(DateTime.Now + "   " + type.FullName + "." + method.Name + " " + log);

                ListBox_Logs.Items.Add(DateTime.Now + "   " + log); // + type.FullName + "." + method.Name + " "

                ListBox_Logs.InvalidateVisual();
                ListBox_Logs.UpdateLayout();
            }
            catch (Exception)
            {

            }
        }

        public static void SetLog(string log, ListBox ListBox_Logs)
        {
            try
            {
                String path = Environment.GetFolderPath(Environment.SpecialFolder.CommonDocuments) + "\\Robot\\";

                if (!Directory.Exists(path))
                {
                    System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(path);
                    dir.Create();
                }

                string name = "" + DateTime.Now.Year + DateTime.Now.Month + DateTime.Now.Day + ".txt";
                //using (var file = new StreamWriter(path + name, true))
                //    file.WriteLine(DateTime.Now + "   " + log);

                ListBox_Logs.Dispatcher.BeginInvoke(new Action(delegate()
                {
                    ListBox_Logs.Items.Add(DateTime.Now + "   " + log);

                    ListBox_Logs.InvalidateVisual();
                    ListBox_Logs.UpdateLayout();
                }));
            }
            catch (Exception)
            {

            }
        }

        public static void SetLog(string log, Type type, MethodBase method)
        {
            try
            {
                String path = Environment.GetFolderPath(Environment.SpecialFolder.CommonDocuments) + "\\Robot\\";

                if (!Directory.Exists(path))
                {
                    System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(path);
                    dir.Create();
                }

                string name = "" + DateTime.Now.Year + DateTime.Now.Month + DateTime.Now.Day + ".txt";
                using (var file = new StreamWriter(path + name, true))
                {
                    file.WriteLine(DateTime.Now + "   " + type.FullName + "." + method.Name + " " + log);
                }
            }
            catch (Exception)
            {

            }
        }
        public static double ToDoubleFormControls(string text)
        {
            try
            {
                if (text.Length == 0)
                    return 0;
                return Convert.ToDouble(text);
            }
            catch (Exception)
            {
                try
                {
                    char ch = '0';
                    for (int i = 0; i < text.Length; i++)
                    {
                        if (text[i] == '.' || text[i] == ',')
                            ch = text[i];
                    }
                    string[] part = text.Split(ch);
                    if (ch == '.')
                        return Convert.ToDouble(part[0] + ',' + part[1]);
                    else return Convert.ToDouble(part[0] + '.' + part[1]);
                }
                catch (Exception)
                {
                    return 0;
                }
            }
        }
        public static string SetFormate(int accuracy)
        {
            String result = "{0:0}";
            if (accuracy == 0)
                result = "{0:0}";
            if (accuracy == 1)
                result = "{0:0.0}";
            if (accuracy == 2)
                result = "{0:0.00}";
            if (accuracy == 3)
                result = "{0:0.000}";
            if (accuracy == 4)
                result = "{0:0.0000}";
            if (accuracy == 5)
                result = "{0:0.00000}";
            if (accuracy == 6)
                result = "{0:0.000000}";

            return result;
        }
        public static double getDouble(String frmt, Double pr)
        {
            return Convert.ToDouble(String.Format(frmt, pr));
        }
        public static string GetID()
        {
            string str = "";
            ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_Processor");
            foreach (ManagementObject queryObj in searcher.Get())
                str = queryObj["ProcessorId"].ToString();
            return str;
        }
        public static string GetMacAddress()
        {
            string macAddresses = "";
            foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
            {
                if (nic.OperationalStatus == OperationalStatus.Up)
                {
                    macAddresses += nic.GetPhysicalAddress().ToString();
                    break;
                }
            }
            return macAddresses;
        }
        public static object DeepClone(object obj)
        {

            if (obj == null) { return null; }
            object result = null;
            try
            {
                using (MemoryStream ms = new MemoryStream())
                {
                    BinaryFormatter bf = new BinaryFormatter();
                    bf.Serialize(ms, obj);
                    ms.Position = 0;
                    result = bf.Deserialize(ms);
                }

            }
            catch { }
            return result;
        }

        #region Получение списка всех квиков

        public static List<String> getListPathFile()
        {
            List<string> PathFile = new List<string>();
            string[] DriverList = Environment.GetLogicalDrives();
            for (int i = 0; i < DriverList.Length; i++)
            {

                DirectoryInfo di = new DirectoryInfo((DriverList[i]));
                Cfg.RecursGetPath(di, "info.exe", PathFile);
            }
            return PathFile;
        }

        static void RecursGetPath(DirectoryInfo predDirec, string findFile, List<string> pathfile)
        {

            FileInfo[] fi;
            try
            {
                fi = predDirec.GetFiles();//Сюда попадут все файлы этой папки
            }
            catch
            {
                return;
            }
            for (int i = 0; i < fi.Length; i++)
            {
                if (fi[i].Name == findFile)
                {
                    pathfile.Add((fi[i].DirectoryName));

                }
            }
            DirectoryInfo[] di = predDirec.GetDirectories();
            for (int i = 0; i < di.Length; i++)
            {
                RecursGetPath(di[i], findFile, pathfile);
            }
        }

        #endregion


    }
}
